#ifndef collision_H
#define collision_H

#include "personnage.h"

int contactEnnemi (personnage* perso, personnage* Ennemi); /* Verifie */
/* Preconditions : perso et Ennemi sont initialises et non NULL */
/* Postconditions : retourne 1 s'il y a contact entre les hitbox de perso et Ennemi, 0 sinon */

int contactBloc (bloc* B1, bloc* B2); /* Verifie */
/* Preconditions : perso et arme sont initialises et non NULL */
/* Postconditions : retourne 1 s'il y a contact entre les hitbox de perso et arme, 0 sinon */

int contactDeadZone (personnage* perso, bloc* DeadZone);
/* Preconditions : perso et DeadZone sont initialises et non NULL */
/* Postconditions : retourne 1 s'il y a contact entre les hitbox de perso et DeadZone, 0 sinon */

int contactMur (personnage* perso, bloc* Mur); /* Verifie */
/* Preconditions : perso et Mur sont initialises et non NULL */
/* Postconditions : retourne 1 s'il y a contact entre les hitbox de perso et Mur, 0 sinon */

int contactSol (personnage* perso, bloc* Sol); /* Verifie */
/* Preconditions : perso et Mur sont initialises et non NULL */
/* Postconditions : retourne 1 s'il y a contact entre les hitbox de perso et Sol, 0 sinon */

int projectileRencontreMur (terrain* T, projectile* A); /* Verifie */
/* Preconditions : T et A sont initialises et non NULL */
/* Postconditions : retourne 1 si la hitbox de A rentre en contact avec un bloc de T dont la variable solide = 2, 0 sinon */

int projectileRencontreEnnemi (listeEnnemis* L, projectile* A); /* Verifie */
/* Preconditions : L et arme sont initialises et non NULL */
/* Postconditions : retourne 1 si la hitbox de A rentre en contact avec un bloc de T dont la variable solide = 1, 0 sinon */

int recherchePositionEnnemi (listeEnnemis* L, personnage* Ennemi);
/* Preconditions : */
/* Postconditions :  */

int persoRencontreMurADroite (terrain* T, personnage* P); /* Verifie */
/* Preconditions : T et P sont initialises et non NULL */
/* Postconditions : retourne 1 si la hitbox de P entre en contact avec un bloc de T sur sa droite */

int persoRencontreMurAGauche (terrain* T, personnage* P); /* Verifie */
/* Preconditions : T et P sont initialises et non NULL */
/* Postconditions : retourne 1 si la hitbox de P entre en contact avec un bloc de T sur sa gauche */

 int persoSeCogneAuPlafond (terrain* T, personnage* P); /* Verifie */
/* Preconditions : T et P sont initialises et non NULL */
/* Postconditions : retourne 1 si la hitbox de P entre en contact avec un bloc de T au dessus de lui */

int persoSortDuSol (terrain* T, personnage* P);
/* Preconditions :  */
/* Postconditions :  */

int persoAuSol (terrain* T, personnage* P); /* Verifie */
/* Preconditions : T et P sont initialises et non NULL */
/* Postconditions : retourne 1 si la hitbox de P entre en contact avec un bloc de T sous ses pieds */

int herosRencontreEnnemi (listeEnnemis* L, personnage* Heros); /* Verifie */
/* Preconditions : L et Heros sont initialises et non NULL */
/* Postconditions : retourne 1 si la hitbox de Heros entre en contact avec celle d'un Ennemi contenu dans L */

void degatsCorpsACorps (terrain* T, personnage* Heros, listeEnnemis* L, int position);
/* Preconditions :  */
/* Postconditions :  */

void Gravite (terrain* Niveau, personnage* Perso, int vitesse); /* Verifie */
/* Preconditions : Niveau et Perso sont initialises et non NULL, vitesse > 0 */
/* Postconditions : Si le bas de la hitbox de Heros n'est pas en contact avec Niveau, l'ordonnee de sa position augmente de vitesse */

void sautPerso (personnage* Perso, const int hauteur);
/* Preconditions :  */
/* Postconditions :  */

int projectileDansChargeur (personnage* P, projectile* Munition);
/* Preconditions :  */
/* Postconditions :  */

projectile* rechercheProchainProjectileUtilisable (personnage* P);
/* Preconditions :  */
/* Postconditions :  */

void Tir (projectile* P);
/* Preconditions :  */
/* Postconditions :  */

void projectileHerosAvance (terrain* T, projectile* P, listeEnnemis* L, personnage* Heros);
/* Preconditions :  */
/* Postconditions :  */

void progressionProjectilesHeros (terrain* T, listeEnnemis* L, personnage* Heros);
/* Preconditions :  */
/* Postconditions :  */

/* Actions possibles pour les ennemis :
	1) Ne rien faire
	2) Tomber
	3) Avancer de droite a gauche
	4) Avancer de gauche a droite et inversement
	5) Tirer dans une seule direction
	6) Tirer sur le perso
*/

void collisionTestRegression();

#endif
